﻿
#include "Header.h"

void test_set()
{
	yyp::unordered_set<int> s;
	int a[] = { 4, 2, 6, 1, 3, 5, 15, 7, 16, 14, 3, 3, 15};

	// 重复数据不会插入
	for (const auto& e : a)
	{
		s.insert(e);
	}
	for (const auto& e : s)
	{
		cout << e << " ";
	}
	cout << endl;

	//yyp::unordered_set<int>::iterator it = s.begin();
	yyp::unordered_set<int>::const_iterator it = s.cbegin();

	//while (it != s.end())
	while (it != s.cend())
	{
		// 不⽀持修改
		//*it += 1; // err 表达式必须是可修改的左值
		cout << *it << " ";
		++it;
	}
	cout << endl;
	cout << endl;
}

void test_map()
{
	yyp::unordered_map<string, string> dict;
	dict.insert({ "sort", "排序" });
	dict.insert({ "left", "左边" });
	dict.insert({ "right", "右边" });
	dict["left"] = "左边，剩余";
	dict["insert"] = "插入";
	dict["string"];

	yyp::unordered_map<string, string>::iterator it = dict.begin();
	//yyp::unordered_map<string, string>::const_iterator it = dict.cbegin();	// 若 const 迭代器也命名为 begin()，由于没有实现从普通迭代器到 const 迭代器的转换，会报错。这里直接用名字cbegin和cend进行准确区分

	while (it != dict.end())
	//while (it != dict.cend())
	{
		cout << it->first << ":" << it->second << endl;
		++it;
	}
	cout << endl;

	for (it = dict.begin(); it != dict.end(); it++)
	//for (it = dict.cbegin(); it != dict.cend(); ++it)
	{
		// 不能修改first，可以修改second
		// 实际所需的重载参数是(const string, char)。但是 const 修饰的对象不允许被修改，标准库也不会为 const string 设计允许修改自身的 operator+= 重载（实际上，string 的 operator+= 是 非 const 成员函数，只能被非 const 对象调用）
		//it->first += 'x';	// err 二进制“=”: 没有找到接受“_Ty1”类型的左操作数的运算符(或没有可接受的转换) 。报错信息是正常的

		it->second += 'x';	// const 迭代器，key-val 中的 val 也无法修改
		cout << it->first << ":" << it->second << endl;
	}
}

int main()
{
	test_set();
	test_map();

	return 0;
}